#include "utl.h"

CUtl::CUtl()
{
}


CUtl::~CUtl()
{
}

int CUtl::getParamFromBuffer(char* pData, quint16& uiParamVal)
{
	uiParamVal = (unsigned char)*pData;
	uiParamVal = uiParamVal * 256;

	++pData;

	uiParamVal += (unsigned char)*pData;

	return 0;
}

int CUtl::addParam2Buffer(char* pData, quint16 uiParamVal)
{
	*pData = (char)(uiParamVal >> 8);

	++pData;
	*pData = (char)(uiParamVal);

	return  0;
}


int CUtl::addCRC2Buffer(uchar *pData, int iLen)
{
	quint16 usCRC = CRC16(pData, iLen);

	return addParam2Buffer((char*)(pData + iLen), usCRC);
}

// 计算CRC校验
//********************************************************************
// FUCTION: CRC16 —— CRC16校验生成函数
// VERSION: 1	(2010-9-27 14:34:01)
// INPUT:	dat_buf 待校验数值缓存区
// 			dat_len 待校验数值缓存区的长度
// OUTPUT:	CRC16校验值
// EXAMPLE:
// 输入数据 dat_buf指向的数组为： 0x33, 0x78, 0x98, 0x60, 校验长度为4
// 则输出为：高字节0x3B 低字节0x78
// NOTE：	参考技术标准文件《CRC校验原理》		
//********************************************************************
quint16 CUtl::CRC16(uchar *dat_buf, quint16 dat_len)
{
	uchar j, r1, r2, r3, r4;
	quint16 i;

	r1 = dat_buf[0];
	r2 = dat_buf[1];

	for (i = 2; i < dat_len + 2; i++)
	{
		if (i < dat_len)
		{
			r3 = dat_buf[i];
		}
		else
		{
			r3 = 0;
		}

		for (j = 0; j < 8; j++)
		{
			r4 = r1;
			r1 = (r1 << 1);
			if ((r2 & 0x80) != 0) r1++;
			r2 = r2 << 1;
			if ((r3 & 0x80) != 0) r2++;
			r3 = (r3 << 1);
			if ((r4 & 0x80) != 0)
			{
				r1 = r1 ^ 0x10;
				r2 = r2 ^ 0x21;
			}
		}
	}
	return (r1 * 0x100 + r2);
}
